home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / du_lib / s_list.c < prev    next >
C/C++ Source or Header  |  1995-07-10  |  10KB  |  441 lines

  1. /*
  2.    DU_LIB v2
  3.    Gem Window Management & Dialog Library For Lattice C
  4.    ½1994,95 by Craig Graham.
  5.    Based on the DU_LIBv1 Library for HiSoft Basic.
  6. */
  7.  
  8. /*
  9.     Scrolling List Support
  10.     NOTE: Scrolling list objects MUST be cut-pasted from the library dialog.
  11.     Major use is made of callback functions to implement the scrolling
  12.     list widget.....
  13. */
  14.  
  15. #include "dulib.h"
  16.  
  17. /*
  18.     Set a scrolling list initially.
  19.     wait_event returns selection number in the global scroll_selection
  20. */
  21. short Set_scroll_list(short dialog, short ob, short e, char *text_list[], short nt, short nd)
  22. {
  23.     OBJECT* l;
  24.     OBJECT* lo;
  25.     Elist *n;
  26.     short f,ml,ln;
  27.     
  28.     n=(Elist*)0;
  29.  
  30.     ml=0;
  31.     for (f=0; f<nt; f++)
  32.     {
  33.         ln=strlen(text_list[f]);
  34.         if (ln>ml) ml=ln;
  35.     }
  36.     ml++;
  37.  
  38.     Set_object_callback(dialog, (short)(ob+scroll_up), &ScrollListUp);
  39.     Set_object_callback(dialog, (short)(ob+scroll_down), &ScrollListDown);
  40.     Set_object_callback(dialog, (short)(ob+scroll_drag), &ScrollListDrag);
  41.     Set_object_callback(dialog, (short)(ob+scroll_text_area), &SelectFromScrollList);
  42.     Set_object_dcallback(dialog, (short)(ob+scroll_text_area), &SelectFromScrollList);
  43.     Set_object_redraw(dialog, (short)(ob+scroll_text_area), &DisplayScrollList);
  44.     Set_object_event(dialog, (short)(ob+scroll_text_area), e);
  45.     Set_object_devent(dialog, (short)(ob+scroll_text_area), e);
  46.     Set_object_event(dialog, ob, e);
  47.     rsrc_gaddr(0,dialog,&l);
  48.     lo=l+ob;
  49.     lo->ob_height=nd*16+8;
  50.     lo->ob_width=ml*8+21;
  51.     lo=l+(ob+scroll_text_area);
  52.     lo->ob_height=nd*16+6;
  53.     lo->ob_width=ml*8;
  54.     lo=l+(ob+scroll_drag_background);
  55.     lo->ob_height=nd*16-33;
  56.     lo=l+(ob+scroll_down);
  57.     lo->ob_y=nd*16-11;
  58.  
  59.     if (find_event(dialog,ob,&n))
  60.     {
  61.         n->stext.texts=text_list;
  62.         n->stext.number=nt;
  63.         n->stext.display=nd;
  64.         n->stext.current=0;
  65.         n->stext.start=0;
  66.         return 1;
  67.     }else{
  68.         form_alert(1,"[1][ ERROR: unable to create scroll list. ][ OOPS ]");
  69.         return 0;
  70.     }
  71. }
  72.  
  73. /*
  74.     Change a scrolling lists contents.
  75. */
  76. short Change_scroll_list(short dialog, short ob, char *text_list[], short nt)
  77. {
  78.     OBJECT *l;
  79.     Elist *n;
  80.     
  81.     n=(Elist*)0;
  82.  
  83.     if (find_event(dialog,ob,&n))
  84.     {
  85.         n->stext.texts=text_list;
  86.         n->stext.number=nt;
  87.         n->stext.current=0;
  88.         n->stext.start=0;
  89.         
  90.         rsrc_gaddr(0,dialog,&l);
  91.         l=l+(ob+scroll_drag);
  92.         l->ob_y=1;
  93.  
  94.         dialog_update(dialog);
  95.  
  96.         return 1;
  97.     }else{
  98.         form_alert(1,"[1][ ERROR: try to change scroll | text on non-event object. ][ OOPS ]");
  99.         return 0;
  100.     }
  101. }
  102.  
  103. short SelectFromScrollList(void)
  104. {
  105.     OBJECT *l;
  106.     short my,y;
  107.     short start,nd,nt,ne,s,sel,dh;
  108.     char *(*a);
  109.     Elist *n;
  110.  
  111.     n=(Elist*)0;
  112.  
  113.     if (find_event(this_dialog,(short)(this_ob-scroll_text_area),&n))
  114.     {
  115.         if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_text_area),&a,&start,&nt,&nd,&junk))
  116.         {
  117.             dh=n->stext.display;
  118.             
  119.             graf_mkstate(&junk,&my,&junk,&junk);
  120.             y=my-cr_clip.g_y-10;
  121.  
  122.             sel=(y*dh)/(cr_clip.g_h-8);
  123.             if (sel<0) sel=0;
  124.             if (sel>nd) sel=nd;
  125.     
  126.             ne=start+nd;
  127.             if (ne>nt) ne=nt;
  128.     
  129.             rsrc_gaddr(0,this_dialog,&l);
  130.             Get_ob_info(l,this_ob,&junk,&junk,&s);
  131.             graf_mouse(M_OFF,NULL);
  132.             n->stext.current=sel+start;
  133.         
  134.             DisplayScrollList();
  135.  
  136.             graf_mouse(M_ON,NULL);
  137.             scroll_selection=sel+start;
  138.             
  139.             switch (click_count)            // allow seperate events for single & double clicks
  140.             {
  141.                 case 1:
  142.                     return n->this_event;
  143.                     break;
  144.                 case 2:
  145.                     return n->this_devent;
  146.                     break;
  147.             }
  148.             
  149.         }else{
  150.             form_alert(1,"[1][ ERROR: cannot select scroll text. ][ OOPS ]");
  151.             return 0;
  152.         }
  153.     }else{
  154.         form_alert(1,"[1][ ERROR: cannot select scroll text. ][ OOPS ]");
  155.         return 0;
  156.     }
  157. }
  158.  
  159. short ScrollListDrag(void)
  160. {
  161.     OBJECT *l;
  162.     OBJECT *lo;
  163.     short sl_ob;
  164.     Elist *obj;
  165.     char *(*t);
  166.     short bh,start,istart,ostart,current,nt,nd,my,mb,y;
  167.     short clip[4];
  168.  
  169.     sl_ob=this_ob-scroll_drag;
  170.     if (Get_object_scroll(this_dialog,sl_ob,&t,&istart,&nt,&nd,¤t))
  171.     {
  172.         find_event(this_dialog,sl_ob,&obj);
  173.  
  174.         rsrc_gaddr(0,this_dialog,&l);
  175.         lo=l+sl_ob+scroll_drag_background;
  176.  
  177.         bh=lo->ob_height;
  178.         lo=l+this_ob;
  179.         bh=bh-(lo->ob_height);
  180.         
  181.         if (nt>nd)
  182.         {
  183.             this_ob=sl_ob+scroll_text_area;
  184. #ifndef __USE_GNU
  185.             objc_xywh(l,this_ob,&cr_clip);
  186. #else
  187.             objc_offset(l,this_ob,&x,&y);
  188.             cr_clip.g_x=x;
  189.             cr_clip.g_y=y;
  190.             cr_clip.g_w=(l+this_ob)->ob_width;
  191.             cr_clip.g_h=(l+this_ob)->ob_height;
  192. #endif
  193.             clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
  194.             vs_clip(x_handle,1,clip);
  195.  
  196.             ostart=start=istart;
  197.             graf_mkstate(&junk,&my,&mb,&junk);
  198.             my=my*(nt-nd)/(bh-2);
  199.             for (; mb==1; graf_mkstate(&junk,&y,&mb,&junk))
  200.             {
  201.                 y=y*(nt-nd)/(bh-2);
  202.                 start=istart+(y-my);
  203.                 if (start<0) start=0;
  204.                 if ((start+nd)>nt) start=nt-nd;
  205.                 if (start!=ostart)
  206.                 {
  207.                     obj->stext.start=start;
  208.                     lo->ob_y=(((bh-2)*start)/(nt-nd))+1;
  209.                     graf_mouse(M_OFF,NULL);
  210.                     objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
  211.                     objc_draw(l,(sl_ob+scroll_drag_background),2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
  212.                     DisplayScrollList();
  213.                     graf_mouse(M_ON,NULL);
  214.                     ostart=start;
  215.                 }
  216.             }
  217.             return TRUE;
  218.         } else {
  219.             return FALSE;
  220.         }
  221.     } else {
  222.         return FALSE;
  223.     }
  224. }
  225.  
  226. short ScrollListUp(void)
  227. {
  228.     OBJECT *l;
  229.     OBJECT *lo;
  230.     Elist *obj;
  231.     char *(*t);
  232.     short bh,start,ostart,current,nt,nd,mb;
  233.     short clip[4];
  234.     
  235.     if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_up),&t,&start,&nt,&nd,¤t))
  236.     {
  237.         find_event(this_dialog,(short)(this_ob-scroll_up),&obj);
  238.  
  239.         rsrc_gaddr(0,this_dialog,&l);
  240.         lo=l+(this_ob-scroll_up+scroll_drag_background);
  241.  
  242.         bh=lo->ob_height;
  243.         lo=l+(this_ob-scroll_up+scroll_drag);
  244.         bh=bh-(lo->ob_height);
  245.         
  246.         if (nt>nd)
  247.         {
  248.             this_ob=this_ob-scroll_up+scroll_text_area;
  249. #ifndef __USE_GNU
  250.             objc_xywh(l,this_ob,&cr_clip);
  251. #else
  252.             objc_offset(l,this_ob,&x,&y);
  253.             cr_clip.g_x=x;
  254.             cr_clip.g_y=y;
  255.             cr_clip.g_w=(l+this_ob)->ob_width;
  256.             cr_clip.g_h=(l+this_ob)->ob_height;
  257. #endif
  258.             clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
  259.             vs_clip(x_handle,1,clip);
  260.  
  261.             ostart=start;
  262.             mb=1;
  263.             for (; (mb==1); graf_mkstate(&junk,&junk,&mb,&junk))
  264.             {
  265.                 if (start>0)
  266.                 {
  267.                     start=start-1;
  268.                     if (start!=ostart)
  269.                     {
  270.                         obj->stext.start=start;
  271.                         lo->ob_y=(((bh-2)*start)/(nt-nd))+1;
  272.                         graf_mouse(M_OFF,NULL);
  273.                         objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
  274.                         objc_draw(l,(short)(this_ob-scroll_text_area+scroll_drag_background),2,scrn_x,scrn_y,scrn_w,scrn_h);
  275.                         DisplayScrollList();
  276.                         graf_mouse(M_ON,NULL);
  277.                         ostart=start;
  278.                     }
  279.                 }
  280.             }
  281.             return 1;
  282.         } else {
  283.             return 0;
  284.         }
  285.     } else {
  286.         return 0;
  287.     }
  288. }
  289.  
  290. short ScrollListDown(void)
  291. {
  292.     OBJECT *l;
  293.     OBJECT *lo;
  294.     Elist *obj;
  295.     char *(*t);
  296.     short bh,start,ostart,current,nt,nd,mb;
  297.     short clip[4];
  298.     
  299.     if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_down),&t,&start,&nt,&nd,¤t))
  300.     {
  301.         find_event(this_dialog,(short)(this_ob-scroll_down),&obj);
  302.  
  303.         rsrc_gaddr(0,this_dialog,&l);
  304.         lo=l+(this_ob-scroll_down+scroll_drag_background);
  305.  
  306.         bh=lo->ob_height;
  307.         lo=l+(this_ob-scroll_down+scroll_drag);
  308.         bh=bh-(lo->ob_height);
  309.         
  310.         if (nt>nd)
  311.         {
  312.             this_ob=this_ob-scroll_down+scroll_text_area;
  313. #ifndef __USE_GNU
  314.             objc_xywh(l,this_ob,&cr_clip);
  315. #else
  316.             objc_offset(l,this_ob,&x,&y);
  317.             cr_clip.g_x=x;
  318.             cr_clip.g_y=y;
  319.             cr_clip.g_w=(l+this_ob)->ob_width;
  320.             cr_clip.g_h=(l+this_ob)->ob_height;
  321. #endif
  322.             clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
  323.             vs_clip(x_handle,1,clip);
  324.  
  325.             ostart=start;
  326.             mb=1;
  327.             for (; (mb==1); graf_mkstate(&junk,&junk,&mb,&junk))
  328.             {
  329.                 if ((start+nd)<nt)
  330.                 {
  331.                     start=start+1;
  332.                     if (start!=ostart)
  333.                     {
  334.                         obj->stext.start=start;
  335.                         lo->ob_y=1+(((bh-2)*start)/(nt-nd));
  336.                         graf_mouse(M_OFF,NULL);
  337.                         objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
  338.                         objc_draw(l,(short)(this_ob-scroll_text_area+scroll_drag_background),2,scrn_x,scrn_y,scrn_w,scrn_h);
  339.                         DisplayScrollList();
  340.                         graf_mouse(M_ON,NULL);
  341.                         ostart=start;
  342.                     }
  343.                 }
  344.             }
  345.             return 1;
  346.         } else {
  347.             return 0;
  348.         }
  349.     } else {
  350.         return 0;
  351.     }
  352. }
  353.  
  354. short DisplayScrollList(void)
  355. {
  356.     char *(*dt);
  357.     Elist *n;
  358.     short tl,ne,start,nt,nd,current;
  359.     short rect[4];
  360.     
  361.     n=(Elist*)0;
  362.  
  363.     if (find_event(this_dialog,this_ob,&n))
  364.     {
  365.         Get_object_scroll(this_dialog,(short)(this_ob-scroll_text_area),&dt,&start,&nt,&nd,¤t);
  366.         
  367.         if (nd==0) return 1;
  368.         
  369.         ne=start+nd;
  370.         if (ne>nt) ne=nt;
  371.         vst_color(x_handle,1); vst_point(x_handle,10,&junk,&junk,&junk,&junk);
  372.         vst_rotation(x_handle,0); vst_alignment(x_handle,0,0,wm_inv,wm_outv);
  373.         vsf_color(x_handle,0); vsf_interior(x_handle,FIS_SOLID); vsf_perimeter(x_handle,0);
  374.         vswr_mode(x_handle,MD_TRANS);
  375.  
  376.         rect[0]=cr_clip.g_x; rect[2]=rect[0]+cr_clip.g_w-1; 
  377.         rect[1]=cr_clip.g_y; rect[3]=rect[1]+cr_clip.g_h-1;
  378.         v_bar(x_handle,rect);
  379.         vsf_color(x_handle,1);
  380.  
  381.         tl=cr_clip.g_y+18;
  382.         for(ne=start; ne<start+nd; ne++)
  383.         {
  384.             if (ne==current)
  385.             {
  386.                 if (ScrollSelectionIsInverse)
  387.                 {
  388.                     vst_color(x_handle,0);
  389.                 }else{
  390.                     vst_effects(x_handle,1);
  391.                 }
  392.                 rect[1]=tl-15; rect[3]=rect[1]+16;
  393.                 v_bar(x_handle,rect);
  394.                 v_gtext(x_handle,cr_clip.g_x+5,tl,dt[ne]);
  395.                 if (ScrollSelectionIsInverse)
  396.                 {
  397.                     vst_color(x_handle,1);
  398.                 }else{
  399.                     vst_effects(x_handle,0);
  400.                 }
  401.             }else{
  402.                 v_gtext(x_handle,cr_clip.g_x+5,tl,dt[ne]);
  403.             }
  404.             tl=tl+16;
  405.         }
  406.         return 1;
  407.     } else {
  408.         return 0;
  409.     }
  410. }
  411.  
  412. short Get_object_scroll(short dialog, short ob, char *(*t[]), short *start, short *nt, short *nd, short *current)
  413. {
  414.     Elist *n;
  415.  
  416.     n=(Elist*)0;
  417.  
  418.     if (find_event(dialog,ob,&n))
  419.     {
  420.         if (n->stext.texts)
  421.         {
  422.             if (n->stext.number<n->stext.display)
  423.             {
  424.                 *start=0;
  425.                 *nd=n->stext.number;
  426.             }else{
  427.                 *start=n->stext.start;
  428.                 *nd=n->stext.display;
  429.             }
  430.             *nt=n->stext.number;
  431.             *t=n->stext.texts;
  432.             *current=n->stext.current;
  433.             return 1;
  434.         } else {
  435.             return 0;
  436.         }
  437.     } else {
  438.         return 0;
  439.     }
  440. }
  441.